/** 
 * 使用第三方验证表单数据
 *  安装 @hapi/joi 包，为表单中携带的每个数据项，定义验证规则。 npm install joi
 *  安装 @escook/express-joi 包，实现自动对表单数据进行验证。 npm install escook@express-joi
 * 
 * 用户请求数据验证器
 */

const joi = require('joi')

/**
 * 官网地址 https://joi.dev/
 * string()  值必须为字符串
 * number()  值必须为数字
 * email()  值必须为邮箱地址
 * alphanum()  值必能包含 a-zA-Z0-9 的字符串
 * min(length)  值最小长度
 * max(length)  值最大长度
 * required()  值为必须项，不能为undefined
 * pattern()  值必须符合正则表达式
 * 
 * messages()  自定义异常信息
 */

// 用户名的验证规则
const username = joi.string().alphanum().min(6).max(16).required().messages({
  "string.empty": "用户名不能为空",
  "string.alphanum": "用户名只能由数字和字母组成",
  "string.min": "用户名不能少于6个字符",
  "string.max": "用户名不能多余16个字符",
  "any.required": "用户名不能为空",
})
// 密码验证规则
const password = joi.string().pattern(/^[\S]{6,24}/).required().messages({
  "string.empty": "密码不能为空",
  "string.pattern.base": "密码必须为6到24个字符",
  "any.required": "密码不能为空",
})
const id = joi.number().integer().required().min(1).messages({
  "any.required": "编号不能为空",
  "number.min": "编号必须为正整数"
})
// 手机号验证规则
const phone = joi.string().pattern(/^(13[0-9]|14[01456879]|15[0-3,5-9]|16[2567]|17[0-8]|18[0-9]|19[0-3,5-9])\d{8}$/).message("手机号不合法")
// 邮箱验证
const email = joi.string().email().message("邮箱格式不合法")
// 年龄规则
const age = joi.number().integer().allow(null).min(0).max(120).messages({
  "number.min": "年龄最小为0岁",
  "number.max": "年龄最大不能超过120岁"
})
// 性别规则  只能填写数字 1(男) 和 2(女)
const gender = joi.number().integer().allow(null).min(1).max(2).messages({
  "number.min": "性别只能为1或2",
  "number.max": "性别只能为1或2"
})

// 性别规则  只能填写数字 1(男) 和 2(女)
const birth = joi.date().allow(null).greater("1900-01-01").message("出生日期必须为yyyy-MM-dd格式")
// 头像规则  
const avatar = joi.string().allow(null)

// 导出注册和登录的验证规则
module.exports.reg_login_valid = {
  body: {
    username,
    password
  }
}

// 导出绑定邮箱验证规则
module.exports.bind_phone_valid = {
  body: {
    phone
  }
}

// 导出绑定邮箱验证规则
module.exports.bind_email_valid = {
  body: {
    email
  }
}

// 导出修改验证规则
module.exports.modify_valid = {
  body: {
    id,
    age,
    gender,
    birth,
    avatar
  }
}